# -*- coding: utf-8 -*-
# @Time    : 2024/7/19 15:52
# @Author  : yujiahao
# @File    : 48_fastapi_testclient.py
# @description:测试

"""

感谢 Starlette (https://www.starlette.io/testclient/)，测试FastAPI 应用轻松又愉快。

它基于 HTTPX（https://www.python-httpx.org/）， 而HTTPX又是基于Requests设计的，所以很相似且易懂。

有了它，你可以直接与FastAPI一起使用 pytest（https://docs.pytest.org/en/8.2.x/）。

"""


from fastapi import FastAPI
# todo 0、导入 TestClient
# 要使用 TestClient，先要安装 httpx. 例如：pip install httpx.
# 也可以用 from starlette.testclient import TestClient。
from fastapi.testclient import TestClient

app = FastAPI()


@app.get("/")
async def read_main():
    return {"msg": "Hello World"}

# todo 1、通过传入你的FastAPI应用创建一个 TestClient
# 当然这里也可以分开，在测试文件中导入要测试的app


client = TestClient(app)

# todo 2、创建名字以 test_ 开头的函数（这是标准的 pytest 约定）。
def test_read_main():
    response = client.get("/")
    """
    在 Python 中，assert 语句用于调试代码。它的作用是测试一个条件，如果条件为 True，则程序继续执行；
    如果条件为 False，则引发一个 AssertionError 异常，并终止程序的执行。assert 语句通常用于单元测试和调试中，
    以确保代码的行为符合预期。
    
        - 验证代码行为：assert 语句用于验证代码的行为是否符合预期。在单元测试中，它们帮助确保代码在各种情况下都能正常工作。
        - 调试：在开发过程中，assert 语句可以帮助捕捉和定位错误，确保代码在进入生产环境之前是正确的。
    
    注意测试函数是普通的 def，不是 async def。
    还有client的调用也是普通的调用，不是用 await。
    这让你可以直接使用 pytest 而不会遇到麻烦。
    除了发送请求之外，如果还想测试时在FastAPI应用中调用 async 函数（例如异步数据库函数）， 
    可以参考一下 https://fastapi.tiangolo.com/zh/advanced/async-tests/。
    
    """
    assert response.status_code == 200
    assert response.json() == {"msg": "Hello World"}